package com.lingxu.base.codegenerate.generate.impl;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.lingxu.base.codegenerate.database.DbReadTableUtil;
import com.lingxu.base.codegenerate.generate.IGenerate;
import com.lingxu.base.codegenerate.generate.pojo.ColumnVo;
import com.lingxu.base.codegenerate.generate.pojo.TableVo;
import com.lingxu.base.codegenerate.generate.util.NonceUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 对单表自动生成代码
 */
public class CodeGenerateOne extends com.lingxu.base.codegenerate.generate.impl.a.a implements IGenerate {
    private static final Logger logger = LoggerFactory.getLogger(CodeGenerateOne.class);
    private final TableVo tableVo;
    private List<ColumnVo> columns;
    private List<ColumnVo> originalColumns;

    public CodeGenerateOne(TableVo tableVo) {
        this.tableVo = tableVo;
    }

    public CodeGenerateOne(TableVo tableVo, List<ColumnVo> columns, List<ColumnVo> originalColumns) {
        this.tableVo = tableVo;
        this.columns = columns;
        this.originalColumns = originalColumns;
    }


    public Map<String, Object> a() throws Exception {
        HashMap tableVoMap = new HashMap();
        // 默认基础包的前缀
        if(this.tableVo.getBasePackage()==null){
            tableVoMap.put("bussiPackage", com.lingxu.base.codegenerate.a.a.basePackage);
        }else{
            tableVoMap.put("bussiPackage", this.tableVo.getBasePackage());
        }

        // 加载CodeGenerator中的配置
        tableVoMap.put("entityPackage", this.tableVo.getEntityPackage());
        tableVoMap.put("entityName", this.tableVo.getEntityName());
        tableVoMap.put("tableName", this.tableVo.getTableName());
        // 主键
        tableVoMap.put("primaryKeyField", com.lingxu.base.codegenerate.a.a.m);
        // 4
        if (this.tableVo.getFieldRequiredNum() == null) {
            this.tableVo.setFieldRequiredNum(StringUtils.isNotEmpty(com.lingxu.base.codegenerate.a.a.n) ? Integer.parseInt(com.lingxu.base.codegenerate.a.a.n) : -1);
        }
        // 3
        if (this.tableVo.getSearchFieldNum() == null) {
            this.tableVo.setSearchFieldNum(StringUtils.isNotEmpty(com.lingxu.base.codegenerate.a.a.o) ? Integer.parseInt(com.lingxu.base.codegenerate.a.a.o) : -1);
        }
        // 1
        if (this.tableVo.getFieldRowNum() == null) {
            this.tableVo.setFieldRowNum(Integer.parseInt(com.lingxu.base.codegenerate.a.a.q));
        }

        tableVoMap.put("tableVo", this.tableVo);

        try {
            if (this.columns == null || this.columns.size() == 0) {
                this.columns = DbReadTableUtil.a(this.tableVo.getTableName());
            }

            tableVoMap.put("columns", this.columns);
            if (this.originalColumns == null || this.originalColumns.size() == 0) {
                this.originalColumns = DbReadTableUtil.b(this.tableVo.getTableName());
            }

            tableVoMap.put("originalColumns", this.originalColumns);
            Iterator var2 = this.originalColumns.iterator();

            while(var2.hasNext()) {
                ColumnVo var3 = (ColumnVo)var2.next();
                if (var3.getFieldName().equalsIgnoreCase(com.lingxu.base.codegenerate.a.a.m)) {
                    tableVoMap.put("primaryKeyPolicy", var3.getFieldType());
                }
            }
        } catch (Exception var4) {
            throw var4;
        }

        long var5 = NonceUtils.c() + NonceUtils.g();
        tableVoMap.put("serialVersionUID", String.valueOf(var5));
        logger.info("load template data: " + tableVoMap);
        return tableVoMap;
    }

    public void generateCodeFile(String stylePath) throws Exception {
        // 生成代码的默认保存地址 使用tableVo中的值替换config中的值
        String createdFileSavePath =null;
        if(this.tableVo.getCreatedFileSavePath()==null){
            createdFileSavePath=com.lingxu.base.codegenerate.a.a.createdFileSavePath;
        }else{
            createdFileSavePath=this.tableVo.getCreatedFileSavePath();
        }

        Map var3 = this.a();
        String var4 = com.lingxu.base.codegenerate.a.a.tempFileDir;
        if (a(var4, "/").equals("lxcode/code-template")) {
            var4 = "/" + a(var4, "/") + "/one";
            com.lingxu.base.codegenerate.a.a.b(var4);
        }

        com.lingxu.base.codegenerate.generate.a.a var5 = new com.lingxu.base.codegenerate.generate.a.a(var4);
        var5.a(stylePath);
        this.a(var5, createdFileSavePath, var3);
        logger.info("  ---- generate  code  success =======> 表名：" + this.tableVo.getTableName() + " ");
    }

    public void generateCodeFile(String projectPath, String templatePath, String stylePath) throws Exception {
        if (projectPath != null && !"".equals(projectPath)) {
            com.lingxu.base.codegenerate.a.a.a(projectPath);
        }

        if (templatePath != null && !"".equals(templatePath)) {
            com.lingxu.base.codegenerate.a.a.b(templatePath);
        }

        this.generateCodeFile(stylePath);
    }


}
